package game;

import java.awt.Dimension;
import java.io.Serializable;
import java.util.ArrayList;


/**
 * Modele de partie
 * @author Julien Roch
 * @version 1.0;
 */
public abstract class Game implements Serializable {
	
	/**
	 * Etat d'une partie
	 */
	public static enum Status{
		/**
		 * Arreter / debriefing
		 */
		STOPPED, 
		/** 
		 * Breifing
		 */
		BRIEFING, 
		/**
		 * En cours
		 */
		STARTED}

	/**
	 * Pour la serialisation 
	 */
	private static final long serialVersionUID = 6919259571003134984L;
	
	
	protected String name;					// nom de la partie
	protected Dimension dimension;			// taille de la partie
	protected ArrayList<String> players;	// nom des joueurs (garder des string?)
	private int id;							// id de la partie
	private String creator;					// pseudo du createur de la partie
	private int nbPlayersMax;				// nombre de joueurs max (on renvoie une erreur si trop)
	protected int timePerPlayer;			// temps max pour un joueur [sec]
	protected int nbMines;
	protected int nbObjMag;
	
	private Status status = Status.BRIEFING;
	
	/**
	 * Constructeur
	 * @param name			nom de la partie
	 * @param creator		pseudo du createur
	 * @param dimension		taille de la grille
	 * @param nbPlayersMax	nombre max de joueurs
	 * @param timePerPlayer	temps max pour un joueur
	 * @param id			id de la partie
	 * @param mines         nombre de mines
	 * @param nbObjMag      nombre d'objets magiques
	 */
	public Game(String name, String creator, Dimension dimension, int nbPlayersMax, 
			int timePerPlayer, int id, int mines, int nbObjMag){
		
		this.name = name;
		this.creator = creator;
		this.dimension = dimension;
		this.nbPlayersMax = nbPlayersMax;
		this.timePerPlayer = timePerPlayer;
		this.id = id;
		this.players = new ArrayList<String>();
		this.nbMines = mines;
		this.nbObjMag = nbObjMag;
		
		this.players.add(creator);
	}
	
	/**
	 * Selecteur de l'identifiant de la partie
	 * @return id de la partie
	 */
	public int getId(){
		return this.id;
	}
	/**
	 * Modificateur du nom de la partie
	 * @param name le nouveau nom
	 */
	public void setName(String name){
		this.name = name;
	}
	/**
	 * Selecteur du nom de la partie
	 * @return le nom de la partie
	 */
	public String getName(){
		return this.name;
	}
	/**
	 * Sélecteur du nom du créateur
	 * @return le nom du créateur
	 */
	public String getCreator(){
		return this.creator;
	}
	/**
	 * Sélecteur de la taille de la partie
	 * @return la taille de la partie
	 */
	public Dimension getDimension(){
		return this.dimension;
	}
	
	/**
	 * Rajoute un joueur a la partie
	 * @param player le joueur
	 */
	public void addPlayer(String player){
		if(this.players.size()==this.nbPlayersMax){
			throw new IndexOutOfBoundsException();
		}
		if(!players.contains(player))
		players.add(player);
	}
	/**
	 * Supprime un joueur de la partie
	 * @param player le joueur
	 */
	public void removePlayer(String player){
		players.remove(player);
	}

	/**
	 * Renvoie la listes des joueurs
	 * @return the players
	 */
	public String[] getPlayers() {
		return players.toArray(new String[players.size()]);
	}
	
	/**
	 * Indique le nombre de joueurs dans la partie
	 * @return players.size
	 */
	public int getNbPLayers() {
		return players.size();
	}

	/**
	 * Renvoie le nombre de joueurs maximum dans une partie
	 * @return the nbPlayersMax
	 */
	public int getNbPlayersMax() {
		return nbPlayersMax;
	}

	/**
	 * Renvoie le temp de jeu par joueur
	 * @return the timePerPlayer
	 */
	public int getTimePerPlayer() {
		return timePerPlayer;
	}
	
	/**
	 * Renvoie le status
	 * @return the status
	 */
	public Status getStatus() {
		return status;
	}

	/**
	 * Renvoi le nombre de mines
	 * @return nombre de mines
	 */
	public int getNbMines() {
		return this.nbMines;
	}
	
	/**
	 * Renvoi ele nombre d'objets magiques
	 * @return nombre d'objets magiques
	 */
	public int getNbObjMag() {
		return this.nbObjMag;
	}

	
	/**
	 * Change le status
	 * @param status the status to set
	 */
	public void setStatus(Status status) {
		this.status = status;
	}
}

